/*
Eteria IRC Client, an RFC 1459 compliant client program written in Java.
Copyright (C) 2000-2001  Javier Kohen <jkohen at tough.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

import java.awt.*;
import java.text.MessageFormat;
import java.util.Observable;
import java.util.Observer;
import ar.com.jkohen.irc.User;
import ar.com.jkohen.irc.MircMessage;
import ar.com.jkohen.awt.NickInfo;
import ar.com.jkohen.util.Resources;
import ar.com.jkohen.util.ConfigurationProperties;

public abstract class ChatWindow extends OutputWindow implements Observer
{
	protected static final String separator = Resources.getString("msg.separator");

    protected static final MessageFormat ME	= new MessageFormat(Resources.getString("msg.me"));
    protected static final MessageFormat ACTION = new MessageFormat(Resources.getString("msg.action"));
    protected static final MessageFormat PRIVMSG = new MessageFormat(Resources.getString("msg.privmsg"));
    protected static final MessageFormat MY_NOTICE = new MessageFormat(Resources.getString("msg.my_notice"));
    protected static final MessageFormat MY_ACTION = new MessageFormat(Resources.getString("msg.my_action"));
	protected static final MessageFormat OP_PRIVMSG = new MessageFormat(Resources.getString("msg.op"));
	protected static final MessageFormat HOP_PRIVMSG = new MessageFormat(Resources.getString("msg.hop"));
	protected static final MessageFormat VOICE_PRIVMSG = new MessageFormat(Resources.getString("msg.voice"));
	protected static final MessageFormat ADMIN_PRIVMSG = new MessageFormat(Resources.getString("msg.admin"));
	protected static final MessageFormat OWNER_PRIVMSG = new MessageFormat(Resources.getString("msg.owner"));
	protected static final MessageFormat MALE_PRIVMSG = new MessageFormat(Resources.getString("msg.male"));
	protected static final MessageFormat FEMALE_PRIVMSG	= new MessageFormat(Resources.getString("msg.female"));
	protected static final MessageFormat UNKNOWN_PRIVMSG = new MessageFormat(Resources.getString("msg.unknown"));

    public ChatWindow(String title)
	{
		super(title);
    }

    public void printAction(String s, String whom)
	{
 		s = emphazeNick(s);
		
		Object [] o = { whom, s };
		text_canvas.appendNickInfo(ACTION.format(o), hyperlinks, whom);

//		postTextEvent();
    }

    public void printMyAction(String s)
	{
		Object [] o = { getNick(), s };
		text_canvas.append(MY_ACTION.format(o));

		postTextEvent();
    }

    public void printInfo(String s)
    {
		s = emphazeNick(s);
		
		Object [] o = { s };
		text_canvas.append(INFO.format(o));
    }
	
	// Channel window message.

    public void printPrivmsg(String s, String whom, User u)
	{
		s = emphazeNick(s);

		Object [] o = { whom, separator, s };
		MessageFormat mf = getMessageFormat(whom);

		if (u != null)
		{
			if (u.isVoiced())
				mf = VOICE_PRIVMSG;
			if (u.isHalfOp())
				mf = HOP_PRIVMSG;
			if (u.isOp())
				mf = OP_PRIVMSG;
			if (u.isAdmin())
				mf = ADMIN_PRIVMSG;
			if (u.isOwner())
				mf = OWNER_PRIVMSG;
		}

		text_canvas.appendNickInfo(mf.format(o), hyperlinks, whom);

//		postTextEvent();
    }

	// Private window message.
	
    public void printPrivmsg(String s, String whom)
	{
		Object [] o = { whom, separator, s };
		MessageFormat mf = getMessageFormat(whom);

		text_canvas.appendNickInfo(mf.format(o), hyperlinks, whom);

		postTextEvent();
    }

	public void printMyPrivmsg(String s)
	{
		Object my_nick[] = { getNick() };
	
		String formatted_nick = ME.format(my_nick);
		
		Object o[] = { formatted_nick, separator, s };
		MessageFormat mf = getMessageFormat(getNick());
		
		text_canvas.appendNickInfo(mf.format(o), hyperlinks, getNick());
//		postTextEvent();
    }
    
    public void printMyPrivmsg(String s, User u)
	{
		Object my_nick[] = { getNick() };
	
		String formatted_nick = ME.format(my_nick);
		
		Object o[] = { formatted_nick, separator, s };
		MessageFormat mf = getMessageFormat(getNick());
		
		if (u != null)
		{
			if (u.isVoiced())
				mf =  VOICE_PRIVMSG;
			if (u.isHalfOp())
				mf =  HOP_PRIVMSG;
			if (u.isOp())
				mf =  OP_PRIVMSG;
			if (u.isAdmin())
				mf =  ADMIN_PRIVMSG;
			if (u.isOwner())
				mf =  OWNER_PRIVMSG;
		}

		text_canvas.appendNickInfo(mf.format(o), hyperlinks, getNick());
//		postTextEvent();
    }

	public void printMyNotice(String s)
	{
		Object o[] = { getNick(), s };
		if (hyperlinks)
			text_canvas.append(MY_NOTICE.format(o));
		else
			text_canvas.appendNoUrls(MY_NOTICE.format(o));

//		postTextEvent();
    }
	
    public void update(Observable o, Object arg)
	{
		ConfigurationProperties props = (ConfigurationProperties)o;

//		if (arg == null || arg.equals("prefix_own"))
//	    	this.prefix_own = props.getBoolean("prefix_own");

		if (arg == null || arg.equals("scroll_speed"))
	    	text_canvas.setMode(props.getInt("scroll_speed"));
			
		if (arg == null || arg.equals("nolinks"))
	    	this.hyperlinks = !props.getBoolean("nolinks");
    }

	public MessageFormat getMessageFormat(String nick)
	{
		MessageFormat mf;
	
   		switch (NickInfo.getSex(nick))
   		{
   		// FIXME: there could be a law prohibiting this.
   		case NickInfo.SEX_MALE:
    	    mf = MALE_PRIVMSG;
    	    break;
		case NickInfo.SEX_FEMALE:
    	    mf = FEMALE_PRIVMSG;
    	    break;
   		default:
    	    mf = UNKNOWN_PRIVMSG;
    	    break;
   		}
   		
		return(mf);
	}
	
	public String emphazeNick(String s)
	{
		String whom = getNick();
		int i = s.toLowerCase().indexOf(whom.toLowerCase());
		if (i >= 0)
		{
       		String before_nick = "";
       		String after_nick = "";
       		char char_before = ' ';
       		char char_after = ' ';
			
			if (i > 0)
				before_nick = s.substring(0, i);
			
			if (i + whom.length() < s.length())
				after_nick = s.substring(i + whom.length());
				
			String before_filter = MircMessage.filterMircAttributes(before_nick);
			if (before_filter.length() > 0)
				char_before = before_filter.charAt(before_filter.length() - 1);
			
			String after_filter = MircMessage.filterMircAttributes(after_nick);
			if (after_filter.length() > 0)
				char_after = after_filter.charAt(0);
			
			if (!Character.isLetterOrDigit(char_before) && !Character.isLetterOrDigit(char_after))
			{
				Object nick[] = { whom };
				String formatted_nick = ME.format(nick);
			
				s = before_nick + formatted_nick + after_nick;
				
				bell();
				postTextEvent();
			}
		}
		return(s);
	}
	
    /* Returns the user's current nick */
    protected abstract String getNick();
	
    /* Sound alert */
    protected abstract void bell();	
}
